#ifndef __SYS_GPIO_H__
#define __SYS_GPIO_H__

#include "sys_types.h"



typedef struct{
   __IO u32_t CFG[4];
   __IO u32_t DAT;
   __IO u32_t DRV[2];
   __IO u32_t PUL[2];
	
}GPIO_TypeDef;

typedef enum
{
  GPIO_Mode_IN   = 0x0, /*!< GPIO Input Mode              */
  GPIO_Mode_OUT  = 0x1, /*!< GPIO Output Mode             */
	GPIO_Mode_010  = 0x2,
	GPIO_Mode_011  = 0x3,
	GPIO_Mode_100  = 0x4,
	GPIO_Mode_101  = 0x5,
	GPIO_Mode_110  = 0x6,
	GPIO_Mode_111  = 0x7,
}GPIOMode_TypeDef;
//PA没有上下拉
typedef enum
{
  GPIO_PuPd_NOPULL = 0x00,
  GPIO_PuPd_UP     = 0x01,
  GPIO_PuPd_DOWN   = 0x02
}GPIOPuPd_TypeDef;
/** @defgroup GPIO_pins_define 
  * @{
  */
#define GPIO_Pin_0                 0
#define GPIO_Pin_1                 1
#define GPIO_Pin_2                 2
#define GPIO_Pin_3                 3
#define GPIO_Pin_4                 4
#define GPIO_Pin_5                 5
#define GPIO_Pin_6                 6
#define GPIO_Pin_7                 7
#define GPIO_Pin_8                 8
#define GPIO_Pin_9                 9
#define GPIO_Pin_10                10
#define GPIO_Pin_11                11
#define GPIO_Pin_12                12
#define GPIO_Pin_13                13
#define GPIO_Pin_14                14
#define GPIO_Pin_15                15
#define GPIO_Pin_16                16
#define GPIO_Pin_17                17
#define GPIO_Pin_18                18
#define GPIO_Pin_19                19
#define GPIO_Pin_20                20
#define GPIO_Pin_21                21
#define GPIO_Pin_22                22
#define GPIO_Pin_23                23
#define GPIO_Pin_24                24
#define GPIO_Pin_25                25
#define GPIO_Pin_26                26
#define GPIO_Pin_27                27
#define GPIO_Pin_28                28
#define GPIO_Pin_29                29
#define GPIO_Pin_30                30
#define GPIO_Pin_31                31

#define GPIO_Pin_All               0xff

#define CPU_PORT_BASE 0x01C20800
#define GPIOA_BASE (CPU_PORT_BASE + 0x24*0)
#define GPIOB_BASE (CPU_PORT_BASE + 0x24*1)
#define GPIOC_BASE (CPU_PORT_BASE + 0x24*2)
#define GPIOD_BASE (CPU_PORT_BASE + 0x24*3)
#define GPIOE_BASE (CPU_PORT_BASE + 0x24*4)
#define GPIOF_BASE (CPU_PORT_BASE + 0x24*5)


#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOC               ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIOD               ((GPIO_TypeDef *) GPIOD_BASE)
#define GPIOE               ((GPIO_TypeDef *) GPIOE_BASE)
#define GPIOF               ((GPIO_TypeDef *) GPIOF_BASE)
              
#define GPIODI               0
#define GPIOEI               1
#define GPIOFI               2

//External INTn Mode (n = 0~7)
#define Positive_Edge 0x0
#define Negative_Edge 0x1
#define High_Level	  0x2
#define Low_Level	    0x3
#define Double_Edge	  0x4 //(Positive/ Negative)


/*
GPIO 初始化
*/
void GPIO_Congif
	(
		GPIO_TypeDef * GPIOx, //GPIO
		unsigned int GPIO_Pin, //Pin
		GPIOMode_TypeDef GPIOMode,//模式
		GPIOPuPd_TypeDef GPIO_PuPd//上下拉
	);
/*
GPIO输出1
*/
void GPIO_SET
	(
		GPIO_TypeDef * GPIOx, //GPIO
		unsigned int GPIO_Pin //Pin
	);
/*
GPIO输出0
*/
void GPIO_RESET
	(
		GPIO_TypeDef * GPIOx, //GPIO
		unsigned int GPIO_Pin //Pin
	);
/*
GPIO读 返回0-1
*/
u8 GPIO_READ 
	(
		GPIO_TypeDef * GPIOx, //GPIO
		unsigned int GPIO_Pin //Pin
	);
/*
GPIO驱动能力设置
Multi_Driving=0-3，0最低，3最高
*/
void GPIO_Multi_Driving 
	(
		GPIO_TypeDef * GPIOx, //GPIO
		unsigned int GPIO_Pin, //Pin
		unsigned int Multi_driving //驱动能力	
	);
//中断相关
void GPIO_External_Inerrupt_Config(int GPIOi,unsigned int GPIO_Pin,int mode);
void GPIO_External_Inerrupt_Enable(int GPIOi,unsigned int GPIO_Pin);
void GPIO_External_Inerrupt_Disable(int GPIOi,unsigned int GPIO_Pin);
unsigned int GPIO_External_Inerrupt_Status(int GPIOi);
	

#endif

		
